package Middelware

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"goShopping/superShopping/superShopping/Utils"
	"log"
	"net/http"
	"strings"
	"time"
)
// JWTAuth 中间件，检查token
func JWTAuth() gin.HandlerFunc{
	return func(ctx *gin.Context) {
		authHeader:=ctx.Request.Header.Get("Authorization")
		if authHeader==""{
			ctx.JSON(http.StatusOK,gin.H{"code":-1,"msg":"无访问权限，请求没有携带token"})
			ctx.Abort()//结束后续操作
			return
		}
		log.Print("token",authHeader)

		//按空格拆分
		parts:=strings.SplitN(authHeader," ",2)
		if!(len(parts)==2 && parts[0]=="Bearer"){
			ctx.JSON(http.StatusOK,gin.H{
				"code":-1,
				"msg":"请求头中auth格式错误",
			})
			ctx.Abort()
			return
		}

		//解析token包含的信息
		claims,err:= Utils.ParseToken(parts[1])
		if err!=nil{
			ctx.JSON(http.StatusOK,gin.H{
				"code":-1,
				"message":"无效的token",
			})
			ctx.Abort()
			return
		}
		//token超时
		if time.Now().Unix()>claims.ExpiresAt{
			ctx.JSON(http.StatusOK,gin.H{"code":-1, "msg":"token过期"})
			ctx.Abort() //阻止执行
			return
		}

		// 将当前请求的claims信息保存到请求的上下文c上
		ctx.Set("claims",claims)
		ctx.Set("username",claims.Username)
		ctx.Set("password",claims.Passwrod)
		ctx.Next()//后续的处理函数可以用过ctx.Get("claims")来获取当前请求的用户信息
	}
}

//跨域
func Cors(context *gin.Context) {
	method := context.Request.Method
	// 必须，接受指定域的请求，可以使用*不加以限制，但不安全
	//context.Header("Access-Control-Allow-Origin", "*")
	context.Header("Access-Control-Allow-Origin", context.GetHeader("Origin"))
	fmt.Println(context.GetHeader("Origin"))
	// 必须，设置服务器支持的所有跨域请求的方法
	context.Header("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE, OPTIONS")
	// 服务器支持的所有头信息字段，不限于浏览器在"预检"中请求的字段
	context.Header("Access-Control-Allow-Headers", "Content-Type, Content-Length, Token")
	// 可选，设置XMLHttpRequest的响应对象能拿到的额外字段
	context.Header("Access-Control-Expose-Headers", "Access-Control-Allow-Headers, Token")
	// 可选，是否允许后续请求携带认证信息Cookir，该值只能是true，不需要则不设置
	context.Header("Access-Control-Allow-Credentials", "true")
	// 放行所有OPTIONS方法
	if method == "OPTIONS" {
		context.AbortWithStatus(http.StatusNoContent)
		return
	}
	context.Next()
}

